package request

import (
	"errors"
	"strconv"

	"github.com/gin-gonic/gin"
)

type CursorRequest struct {
	LastID   string `form:"last_id" json:"last_id"`     // 游标
	PageSize int    `form:"page_size" json:"page_size"` // 每页条数
	Sort     string `form:"sort" json:"sort"`           // 排序字段
	Order    string `form:"order" json:"order"`         // 排序顺序
}

// Default 设置默认值
func (c *CursorRequest) Default() {
	if c.PageSize <= 0 {
		c.PageSize = 20 // 默认每页20条
	}
	if c.Sort == "" {
		c.Sort = "id" // 默认按id排序（必须是唯一字段）
	}
	if c.Order == "" {
		c.Order = "desc" // 默认降序
	}
}

// Parse 解析游标分页请求参数
func Parse(c *gin.Context) (*CursorRequest, error) {
	var req CursorRequest
	if err := c.ShouldBind(&req); err != nil {
		return nil, errors.New("参数错误：" + err.Error())
	}

	req.Default()

	// 验证排序方向
	if req.Order != "" && req.Order != "asc" && req.Order != "desc" {
		return nil, errors.New("参数错误：order 参数 只能是 asc 或 desc")
	}

	// 游标分页的排序字段必须是唯一字段（如id），这里可以额外验证
	// 例如：if !isUniqueField(req.Sort) { return nil, errors.New("排序字段必须是唯一字段") }
	if req.Sort != "" && !isUniqueField(req.Sort) {
		return nil, errors.New("参数错误：排序字段必须是唯一字段")
	}

	return &req, nil
}

// WhereCondition 构造查询条件
func (c *CursorRequest) WhereCondition() (string, interface{}) {
	if c.LastID == "" {
		return "", nil // 第一页，无where条件
	}

	// 将 last_id 转换为对应类型（这里假设是int，根据实际字段类型调整）
	lastID, err := strconv.Atoi(c.LastID)
	if err != nil {
		return "", errors.New("last_id 格式错误")
	}

	// 根据排序方向生成条件
	if c.Order == "desc" {
		// 降序：下一页数据的id小于上一页最后一个id
		return c.Sort + " < ?", lastID
	} else {
		// 升序：下一页数据的id大于上一页最后一个id
		return c.Sort + " > ?", lastID
	}
}

// isUniqueField 验证字段是否唯一
func isUniqueField(field string) bool {
	switch field {
	case "id":
		return true
	default:
		return false
	}
}